package com.example.servlet;

import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

import java.util.*;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadFactory;

@SpringBootTest
public class ServletApplicationTest {

    // 模式匹配
    @Test
    public void patternMatching() {
        Map<String, Object> data = new HashMap<>();
        data.put("key", "aaa");
        var obj = data.get("key");

        // Switch的模式匹配
        var result = switch (obj) {
            case Integer i -> i; // 如果 obj 是 Integer 类型，则执行此代码块
            case String s -> s.length(); // 如果 obj 是 String 类型，则执行此代码块
            default -> throw new IllegalArgumentException("Invalid input");
        };
    }

    // 虚拟线程非常适合I/O密集型任务或需要大量并行性的任务，例如网络服务、数据库查询等。
    // 避免虚拟线程池化，因为虚拟线程是一种非常廉价的资源，每个虚拟线程不应代表某些共享的、池化的资源，而应代表单一任务。在应用程序中，我们应该直接使用虚拟线程而不是通过线程池使用它
    // 虚拟线程
    @Test
    public void virtualThread() {
        Runnable runnable = () -> {
            System.out.println("Hello, World");
        };

        // 可以指定虚拟线程的名字
        ThreadFactory virtualThreadFactory = Thread.ofVirtual()
                .name("java", 0)
                .factory();

        Thread factoryThread = virtualThreadFactory.newThread(runnable);
        factoryThread.start();

        // 建议使用虚拟线程执行器，代码如下，
        try (ExecutorService executorService = Executors.newVirtualThreadPerTaskExecutor()) {
            for (int i = 0; i < 30; i++) {
                executorService.submit(runnable);
            }
        }
    }

    // 有序集合
    @Test
    public void orderedCollection() {
        // 有序集合
        List<Integer> list = new ArrayList<>();
        list.add(1);
        list.add(3);
        list.add(2);
        System.out.println("Before sorting: " + list);
        list.addFirst(5);
        list.addLast(4);
        System.out.println("After sorting: " + list);
        list.sort(Comparator.comparingInt(a -> a));
        System.out.println("After sorting with comparator: " + list);
        list.reversed();
        System.out.println("After reversing: " + list);
        list.removeFirst();
        list.removeLast();
        System.out.println("After removing first and last: " + list);
    }

}
